/**
 * Redux Persist 修复工具
 * 
 * 这个文件包含解决redux-persist引起的localStorage事件循环问题的方法
 * 主要解决重复触发localStorage事件的问题
 */

/**
 * 标记是否正在处理Redux Persist操作，避免事件循环
 */
let isReduxPersistOperation = false;

/**
 * 修补localStorage，防止redux-persist引起的事件循环
 */
export function applyLocalStoragePatch() {
  // 保存原始方法
  const originalSetItem = localStorage.setItem;
  const originalRemoveItem = localStorage.removeItem;

  // 拦截localStorage.setItem
  localStorage.setItem = function(key: string, value: string) {
    // 暂时标记为处理中
    isReduxPersistOperation = true;
    
    // 调用原始方法
    const result = originalSetItem.call(this, key, value);
    
    // 使用setTimeout延迟重置标记，确保当前事件循环完成
    setTimeout(() => {
      isReduxPersistOperation = false;
    }, 0);
    
    return result;
  };

  // 拦截localStorage.removeItem
  localStorage.removeItem = function(key: string) {
    // 暂时标记为处理中
    isReduxPersistOperation = true;
    
    // 调用原始方法
    const result = originalRemoveItem.call(this, key);
    
    // 使用setTimeout延迟重置标记，确保当前事件循环完成
    setTimeout(() => {
      isReduxPersistOperation = false;
    }, 0);
    
    return result;
  };

  // 添加存储事件过滤器
  window.addEventListener('storage', function(event) {
    // 如果是由Redux Persist操作触发的事件，阻止进一步处理
    if (isReduxPersistOperation) {
      event.stopImmediatePropagation();
    }
  }, true); // 使用捕获模式确保最先处理
}

/**
 * 清理localStorage，确保数据一致性
 */
export function cleanupLocalStorage() {
  // 清理可能存在的重复或不一致的键
  const keysToCheck = [
    'persistroot',
    'userInfo',
    'token',
    'user_rights',
  ];
  
  // 检查每个键是否在JSON内容中已存在
  try {
    const persistRootStr = localStorage.getItem('persistroot');
    if (persistRootStr) {
      const persistRoot = JSON.parse(persistRootStr);
      
      // 如果persistRoot已经包含了用户信息和权限，移除单独的条目避免不一致
      if (persistRoot && persistRoot.user) {
        keysToCheck.forEach(key => {
          if (key !== 'persistroot') {
            localStorage.removeItem(key);
            console.log('移除可能造成不一致的本地存储项:', key);
          }
        });
      }
    }
  } catch (error) {
    console.error('清理localStorage时出错:', error);
  }
}

export default {
  applyLocalStoragePatch,
  cleanupLocalStorage
};